home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / e / emodls01.lha / emodules / crunchmania / cruncher.e < prev    next >
Text File  |  1980-07-16  |  13KB  |  486 lines

  1. OPT OSVERSION=37
  2. OPT PREPROCESS
  3.  
  4. /*
  5. *-- AutoRev header do NOT edit!
  6. *
  7. *   Project         :   file cruncher based on CrM.library
  8. *   File            :   cruncher.e
  9. *   Copyright       :   © 1995 Piotr Gapinski
  10. *   Author          :   Piotr Gapinski
  11. *   Creation Date   :   29.12.95
  12. *   Current version :   1.1
  13. *   Translator      :   AmigaE v3.1+
  14. *
  15. *   REVISION HISTORY
  16. *
  17. *   Date          Version         Comment
  18. *   ---------     -------         ------------------------------------------
  19. *   17.12.95      0.9             to many exceptions...
  20. *   26.12.95      0.91            decrunch opt not work
  21. *   28.12.95      1.0             decrunch fixed, tooltypes improved
  22. *   29.12.95      1.1             crunch hook added
  23. *
  24. *-- REV_END --*
  25. */
  26.  
  27. MODULE 'dos/dos','dos/dosextens',
  28.        'intuition/intuition','intuition/screens',
  29.        'exec/lists','exec/nodes',
  30.        'libraries/crm','crm',
  31.        'libraries/reqtools','reqtools',
  32.        'libraries/reqtools','reqtools',
  33.        'utility/tagitem','utility/hooks',
  34.        'tools/easygui',
  35.        'tools/exceptions','tools/constructors',
  36.        'Fabio/ttparse_oo',
  37.        'other/ecode'
  38.  
  39. #define PROGRAMVERSION '$VER: Cruncher 1.1 (29.12.95)'
  40. ->#define SIMPLEGUI 1
  41. #define REQTOOLSNAME 'reqtools.library'
  42. #define REQTOOLSVERSION 38
  43.  
  44. OBJECT guiprefs
  45.   gh:PTR TO guihandle
  46.   scr:PTR TO screen
  47.   crunch:PTR TO cmcrunchstruct
  48.   data:PTR TO dataheader
  49.   freq:PTR TO rtfilerequester
  50.   hook:PTR TO hook
  51.   filegad,listgad,hookgad
  52.   mem,len
  53.   status,count
  54.   messages:PTR TO lh
  55.   filename[40]:ARRAY OF CHAR
  56. ENDOBJECT
  57.  
  58. ENUM ERR_TTYPE,ERR_OK,ERR_ARGS,ERR_CRMLIB,ERR_REQLIB,ERR_CRMSTRUCT,
  59.      ERR_REQSTRUCT,ERR_NOMEM,ERR_NOFILE,ERR_NOSIZE,ERR_READ,ERR_WRITE,
  60.      ERR_CRUNCH,ERR_STATUS
  61. ENUM ARG_SCREEN,NUMARGS
  62. ENUM STATUS_WAIT,STATUS_CRUNCHED,STATUS_DECRUNCHED
  63.  
  64. PROC main() HANDLE
  65.   DEF rdargs=0,args[NUMARGS]:LIST,templ,
  66.       scr=0,scrname[40]:STRING,
  67.       gp=NIL:PTR TO guiprefs,res=-1,
  68.       ttype:PTR TO ttparse
  69.   DEF file,list,hook
  70.  
  71.   IF wbmessage
  72.     NEW ttype.ttparse(TRUE)
  73.     IF ttype.error() THEN Raise(ERR_TTYPE)
  74.     StrCopy(scrname,ttype.get('PUBSCREEN'))
  75.     END ttype
  76.   ELSE
  77.     templ:='PUBSCREEN/K'
  78.     IF (rdargs:=ReadArgs(templ,args,NIL))=NIL THEN Raise(ERR_ARGS)
  79.     StrCopy(scrname,args[ARG_SCREEN])
  80.     FreeArgs(rdargs)
  81.   ENDIF
  82.   scr:=LockPubScreen(scrname)
  83.   IF scr=NIL
  84.     scrname:=NIL
  85.     LockPubScreen(scrname)
  86.   ENDIF
  87.   IF (crmbase:=OpenLibrary(CRMNAME,CRMVERSION))=NIL THEN Raise(ERR_CRMLIB)
  88.   IF (reqtoolsbase:=OpenLibrary(REQTOOLSNAME,
  89.       REQTOOLSVERSION))=NIL THEN Raise(ERR_REQLIB)
  90.  
  91.   gp:=New(SIZEOF guiprefs)
  92.   gp.data:=New(SIZEOF dataheader)
  93.   gp.hook:=New(SIZEOF hook)
  94.   gp.scr:=scr
  95.   gp.crunch:=CmAllocCrunchStructA(
  96.        [CMCS_ALGO,CM_LZH /*OR CM_SAMPLE*/ OR CMF_OVERLAY OR CMF_LEDFLASH,
  97.        TAG_DONE])
  98.   IF gp.crunch=NIL THEN Raise(ERR_CRMSTRUCT)
  99.   gp.freq:=RtAllocRequestA(RT_FILEREQ,NIL)
  100.   IF gp.freq=NIL THEN Raise(ERR_REQSTRUCT)
  101.   gp.messages:=newlist()
  102.  
  103. #ifdef SIMPLEGUI
  104.   gp.gh:=guiinit('Cruncher  (c)Piotr Gapinski',
  105.       [EQROWS,
  106.         file:=[TEXT,NIL,'File:',TRUE,3],
  107.         [EQCOLS,
  108.           [SBUTTON,{load},'Load'],
  109.           [SBUTTON,{save},'Save'],
  110.           [SBUTTON,{info},'About'],
  111.           [SBUTTON,{delete},'Delete']
  112.         ],
  113.         [BAR],
  114.         [EQCOLS,
  115.           [TEXT,' Messages:',NIL,FALSE,3],
  116.           [SPACEH],
  117.           [SBUTTON,{clear},'Clear']
  118.         ],
  119.         list:=[LISTV,{dummy},NIL,40,14,gp.messages,TRUE,0,0],
  120.         hook:=[TEXT,NIL,NIL,TRUE,3]
  121.     ],gp,scr)
  122. #endif
  123.  
  124. #ifndef SIMPLEGUI
  125.   gp.gh:=guiinit('Cruncher  (c)Piotr Gapinski',
  126.     [ROWS,
  127.       [BEVEL,
  128.         [EQROWS,
  129.           file:=[TEXT,NIL,'File:',TRUE,3],
  130.           [COLS,
  131.             [BEVELR,
  132.               [EQCOLS,
  133.                 [SBUTTON,{load},'Load'],
  134.                 [SBUTTON,{save},'Save'],
  135.                 [SBUTTON,{info},'About']
  136.               ]
  137.             ],
  138.             [BEVELR,[SBUTTON,{delete},'Delete']]
  139.           ]
  140.         ]
  141.       ],
  142.       [BEVELR,
  143.         [EQROWS,
  144.           [EQCOLS,
  145.             [TEXT,' Messages:',NIL,FALSE,3],
  146.             [SPACEH],
  147.             [SBUTTON,{clear},'Clear']
  148.           ],
  149.           list:=[LISTV,{dummy},NIL,40,12,gp.messages,TRUE,0,0],
  150.           [BEVEL,
  151.           hook:=[TEXT,NIL,NIL,FALSE,3]
  152.           ]
  153.         ]
  154.       ]
  155.     ],gp,scr)
  156. #endif
  157.  
  158.   gp.filegad:=file
  159.   gp.listgad:=list
  160.   gp.hookgad:=hook
  161.   IF gp.gh<>NIL THEN gp.gh.wnd.flags:=gp.gh.wnd.flags OR WFLG_RMBTRAP
  162.  
  163.   info(gp)  -> say hello :)
  164.  
  165.   WHILE res<0
  166.     Wait(gp.gh.sig)
  167.     res:=guimessage(gp.gh)
  168.   ENDWHILE
  169. EXCEPT DO
  170.   IF gp.gh THEN cleangui(gp.gh)
  171.   IF scr THEN UnlockPubScreen(scrname,scr)
  172.   IF gp
  173.     IF gp.crunch THEN CmFreeCrunchStruct(gp.crunch)
  174.     IF gp.freq THEN RtFreeRequest(gp.freq)
  175.     IF gp.messages THEN freelist(gp.messages,TRUE)
  176.     IF gp.data THEN Dispose(gp.data)
  177.     IF gp.hook THEN Dispose(gp.hook)
  178.     Dispose(gp)
  179.   ENDIF
  180.   IF crmbase THEN CloseLibrary(crmbase)
  181.   IF reqtoolsbase<>NIL THEN CloseLibrary(reqtoolsbase)
  182.   IF exception
  183.     SELECT exception
  184.     CASE ERR_TTYPE
  185.       WriteF('ToolType Parser Error: \d\n', ttype.error())
  186.     CASE ERR_ARGS
  187.       WriteF('Bad args! (try "cruncher ?")\n')
  188.     CASE ERR_CRMLIB
  189.       WriteF('Couldn\at open crm.library!\n')
  190.     CASE ERR_REQLIB
  191.       WriteF('Couldn\at open reqtools.library!\n')
  192.     CASE ERR_CRMSTRUCT
  193.       WriteF('Couldn\at allocate struct (crm)!\n')
  194.     CASE ERR_REQSTRUCT
  195.       WriteF('Couldn\at allocate struct (reqtools)!\n')
  196.     DEFAULT
  197.       WriteF('maybe no free memory?\n');
  198.       report_exception()
  199.       WriteF('LEVEL: main()\n')
  200.     ENDSELECT
  201.   ENDIF
  202. ENDPROC
  203.  
  204. PROC load(gp:PTR TO guiprefs) HANDLE
  205.   DEF handle=NIL,lock=NIL,dir=0,guilock=0,selected
  206.  
  207.   selected:=RtFileRequestA(gp.freq,gp.filename,'Load file...',
  208.     [RT_UNDERSCORE,"_",RT_LOCKWINDOW,TRUE,RT_PUBSCRNAME,gp.scr,
  209.      RT_WINDOW,gp.gh.wnd,
  210.      RTFI_OKTEXT,'_Load',TAG_DONE])
  211.   IF selected<>0
  212.     guilock:=RtLockWindow(gp.gh.wnd)
  213.     IF gp.status<>STATUS_WAIT
  214.       IF gp.mem THEN Dispose(gp.mem)
  215.       gp.mem:=NIL
  216.       gp.status:=STATUS_WAIT
  217.     ENDIF
  218.     settext(gp.gh,gp.filegad,gp.filename)
  219.     lock:=Lock(gp.freq.dir,ACCESS_READ)
  220.     dir:=CurrentDir(lock)
  221.  
  222.     addinfo(gp,'loading "\s" ...',gp.filename)
  223.     IF (handle:=Open(gp.filename,MODE_OLDFILE))=NIL THEN Raise(ERR_NOFILE)
  224.     IF (Read(handle,gp.data,SIZEOF dataheader))<>SIZEOF dataheader THEN
  225.         Raise(ERR_READ)
  226.  
  227.     IF (CmCheckCrunched(gp.data))=0
  228.       crunch(gp,handle)
  229.     ELSE
  230.       decrunch(gp,handle)
  231.     ENDIF
  232.   ELSE
  233.     settext(gp.gh,gp.filegad,NIL)
  234.     addinfo(gp,'nothing to load, no file selected')
  235.   ENDIF
  236. EXCEPT DO
  237.   settext(gp.gh,gp.hookgad,NIL)
  238.   IF guilock THEN RtUnlockWindow(gp.gh.wnd,guilock)
  239.   IF handle THEN Close(handle)
  240.   IF lock
  241.     IF dir THEN CurrentDir(dir)
  242.     UnLock(lock)
  243.   ENDIF
  244.   IF exception
  245.     SELECT exception
  246.     CASE ERR_NOFILE
  247.       addinfo(gp,'aborted, file not found!')
  248.     CASE ERR_NOSIZE
  249.       addinfo(gp,'aborted, file is empty!')
  250.     CASE ERR_READ
  251.       addinfo(gp,'aborted, error while reading!')
  252.     CASE ERR_NOMEM
  253.       addinfo(gp,'aborted, no free memory, file to big')
  254.     CASE ERR_CRUNCH
  255.       addinfo(gp,'aborted, (de)crunch failed!')
  256.     DEFAULT
  257.       report_exception()
  258.       WriteF('LEVEL: load()\n')
  259.     ENDSELECT
  260.     IF gp.status<>STATUS_WAIT
  261.       IF gp.mem THEN Dispose(gp.mem)
  262.       gp.mem:=NIL
  263.       gp.status:=STATUS_WAIT
  264.     ENDIF
  265.   ENDIF
  266. ENDPROC
  267.  
  268. PROC save(gp:PTR TO guiprefs) HANDLE
  269.   DEF handle=0,lock=0,dir=0,guilock=0,selected
  270.  
  271.   IF gp.status=STATUS_WAIT THEN Raise(ERR_STATUS)
  272.   selected:=RtFileRequestA(gp.freq,gp.filename,'Save file as...',
  273.     [RT_UNDERSCORE,"_",RT_LOCKWINDOW,TRUE,RT_PUBSCRNAME,gp.scr,
  274.      RT_WINDOW,gp.gh.wnd,RTFI_FLAGS,FREQF_SAVE OR FREQF_NOBUFFER,
  275.      RTFI_OKTEXT,'_Save',TAG_DONE])
  276.   IF selected<>0
  277.     guilock:=RtLockWindow(gp.gh.wnd)
  278.     lock:=Lock(gp.freq.dir,ACCESS_READ)
  279.     dir:=CurrentDir(lock)
  280.     addinfo(gp,'  saving as "\s"',gp.filename)
  281.     IF (handle:=Open(gp.filename,MODE_NEWFILE))=NIL THEN Raise(ERR_NOFILE)
  282.     IF gp.status=STATUS_CRUNCHED
  283.       IF (Write(handle,gp.data,SIZEOF dataheader))<>SIZEOF dataheader THEN
  284.         Raise(ERR_WRITE)
  285.     ENDIF
  286.     IF (Write(handle,gp.mem+gp.data.minsecdist,gp.len))<>gp.len THEN Raise(ERR_WRITE)
  287.     addinfo(gp,'OK, saved')
  288.   ELSE
  289.     addinfo(gp,'saving aborted')
  290.   ENDIF
  291. EXCEPT DO
  292.   IF guilock THEN RtUnlockWindow(gp.gh.wnd,guilock)
  293.   IF lock
  294.     CurrentDir(dir)
  295.     UnLock(lock)
  296.   ENDIF
  297.   IF handle THEN Close(handle)
  298.   IF exception
  299.     SELECT exception
  300.     CASE ERR_STATUS
  301.       addinfo(gp,'nothing to save, buffer is empty!')
  302.     CASE ERR_NOFILE
  303.       addinfo(gp,'aborted, can\at create file!')
  304.     CASE ERR_WRITE
  305.       addinfo(gp,'aborted, error while writing!')
  306.     DEFAULT
  307.       report_exception()
  308.       WriteF('LEVEL: save()\n')
  309.     ENDSELECT
  310.   ENDIF
  311. ENDPROC
  312.  
  313. PROC crunch(gp:PTR TO guiprefs,handle)
  314.   DEF mem,size,newsize
  315.  
  316.   Seek(handle,0,OFFSET_END)
  317.   size:=Seek(handle,0,OFFSET_BEGINNING)
  318.   gp.len:=size
  319.   mem:=New(size)
  320.   gp.mem:=mem
  321.   IF mem=NIL THEN Raise(ERR_NOMEM)
  322.   IF (Read(handle,mem,size))<>size THEN Raise(ERR_READ)
  323.   addinfo(gp,'  OK.')
  324.  
  325.   gp.crunch.src:=mem
  326.   gp.crunch.srclen:=size
  327.   gp.crunch.dest:=mem
  328.   gp.crunch.destlen:=size
  329.   gp.crunch.datahdr:=gp.data
  330.  
  331.   gp.hook.entry:=eCode({crunchhook})
  332.   gp.hook.subentry:=NIL
  333.   gp.hook.data:=gp
  334.   gp.crunch.displayhook:=gp.hook
  335.   gp.crunch.displaystep:=1024
  336.  
  337.   addinfo(gp,'  C R U N C H I N G')
  338.   newsize:=CmCrunchData(gp.crunch)
  339.  
  340.   gp.len:=newsize
  341.   IF newsize=NIL THEN Raise(ERR_CRUNCH)
  342.   addinfo(gp,'  original len=\d',size)
  343.   addinfo(gp,'  crunched len=\d',newsize)
  344.   gp.status:=STATUS_CRUNCHED
  345. ENDPROC
  346.  
  347. PROC decrunch(gp:PTR TO guiprefs,handle)
  348.   DEF orig,crun,mem,buffsize
  349.  
  350.   orig:=gp.data.originallen
  351.   crun:=gp.data.crunchedlen
  352.   gp.len:=orig
  353.   buffsize:=orig+gp.data.minsecdist
  354.   mem:=New(buffsize)
  355.   gp.mem:=mem
  356.   IF mem=NIL THEN Raise(ERR_NOMEM)
  357.   IF (Read(handle,mem,crun))<>crun THEN Raise(ERR_READ)
  358.   addinfo(gp,'  OK.')
  359.   addinfo(gp,'  D E C R U N C H I N G')
  360.   IF (CmDecrunch(mem,mem+gp.data.minsecdist,gp.data))=NIL THEN Raise(ERR_CRUNCH)
  361.   addinfo(gp,'  crunched len=\d',crun)
  362.   addinfo(gp,'  original len=\d',orig)
  363.   gp.status:=STATUS_DECRUNCHED
  364. ENDPROC
  365.  
  366. PROC info(gp:PTR TO guiprefs)
  367.   addinfo(gp,'*')
  368.   addinfo(gp,PROGRAMVERSION)
  369.   addinfo(gp,'file cruncher based on CrM.library')
  370.   addinfo(gp,'   (c)1995 by Piotr Gapinski')
  371.   addinfo(gp,'            email')
  372.   addinfo(gp,'  kolo8@sparc10.ely.pg.gda.pl')
  373.   addinfo(gp,'            snail')
  374.   addinfo(gp,'    Gutkowo,ul.Stokowa 19,')
  375.   addinfo(gp,'    11-041 Olsztyn, Poland')
  376.   addinfo(gp,NIL)
  377.   addinfo(gp,'CrM.library is (c) by Thomas Schwarz')
  378.   addinfo(gp,'*')
  379. ENDPROC
  380.  
  381. PROC delete(gp:PTR TO guiprefs)
  382.   DEF lock=0,dir=0,answer,selected
  383.  
  384.   selected:=RtFileRequestA(gp.freq,gp.filename,'Delete file...',
  385.     [RT_UNDERSCORE,"_",RT_LOCKWINDOW,TRUE,RT_PUBSCRNAME,gp.scr,
  386.      RT_WINDOW,gp.gh.wnd,RTFI_FLAGS,FREQF_SAVE OR FREQF_NOBUFFER,
  387.      RTFI_OKTEXT,'_Delete',TAG_DONE])
  388.   IF selected<>0
  389.     lock:=Lock(gp.freq.dir,ACCESS_READ)
  390.     dir:=CurrentDir(lock)
  391.     answer:=easygui('Request',
  392.       [ROWS,
  393.         [TEXT,' Delete?',NIL,FALSE,30],
  394.         [TEXT,' Are you sure?',NIL,FALSE,30],
  395.         [BAR],
  396.         [EQCOLS,
  397.           [SBUTTON,0,'Delete'],
  398.           [SPACEH],
  399.           [SBUTTON,1,'Cancel']
  400.       ]
  401.     ],gp,gp.scr)
  402.     IF answer=0
  403.       addinfo(gp,'deleting "\s"...',gp.filename)
  404.       addinfo(gp,IF DeleteFile(gp.filename) THEN 'OK, deleted' ELSE 'error!')
  405.     ELSE
  406.       addinfo(gp,'deleting aborted')
  407.     ENDIF
  408.   ENDIF
  409.   IF lock
  410.     IF dir THEN CurrentDir(dir)
  411.     UnLock(lock)
  412.   ENDIF
  413. ENDPROC
  414.  
  415. PROC clear(gp:PTR TO guiprefs)
  416.   setlistvlabels(gp.gh,gp.listgad,-1)
  417.   freelist(gp.messages)
  418.   setlistvlabels(gp.gh,gp.listgad,gp.messages)
  419.   gp.count:=0
  420. ENDPROC
  421.  
  422. CONST MAX_MESSAGE = 40
  423. PROC addinfo(gp:PTR TO guiprefs,format:PTR TO CHAR,data=NIL)
  424.   DEF node:PTR TO ln,str,temp[40]:STRING
  425.  
  426.   IF (node:=New(SIZEOF ln))=NIL THEN Raise(ERR_NOMEM)
  427.   IF format<>NIL
  428.     IF data<>NIL
  429.       StringF(temp,format,data)
  430.     ELSE
  431.       StrCopy(temp,format)
  432.     ENDIF
  433.     IF (str:=String(StrLen(temp)))=NIL THEN Raise(ERR_NOMEM)
  434.     StrCopy(str,temp)
  435.     node.name:=str
  436.   ENDIF
  437.   setlistvlabels(gp.gh,gp.listgad,-1)
  438.   gp.count:=gp.count+1
  439.   IF gp.count>=MAX_MESSAGE
  440.     gp.count:=MAX_MESSAGE
  441.     freenode(gp.messages)
  442.   ENDIF
  443.   AddTail(gp.messages,node)
  444.   setlistvlabels(gp.gh,gp.listgad,gp.messages)
  445. ENDPROC
  446.  
  447. PROC freelist(list:PTR TO lh,all=FALSE)
  448.   IF list=NIL THEN RETURN     -> already de-allocated
  449.   REPEAT
  450.   UNTIL freenode(list)=FALSE
  451.   IF all=TRUE THEN END list   -> use only with 'constructors.m' lists
  452. ENDPROC
  453.  
  454. PROC freenode(list:PTR TO lh)
  455.   DEF node:PTR TO ln
  456.  
  457.   node:=RemHead(list)
  458.   IF node<>0
  459.     DisposeLink(node.name)
  460.     Dispose(node)
  461.     RETURN TRUE
  462.   ENDIF
  463. ENDPROC FALSE
  464.  
  465. PROC crunchhook()
  466.   DEF stats:PTR TO cmcurrentstats,
  467.       gp:PTR TO guiprefs,
  468.       thishook:PTR TO hook,
  469.       temp[40]:STRING,var
  470.  
  471.   MOVE.L A0,thishook
  472.   MOVE.L A1,stats
  473.   gp:=thishook.data
  474.   var:=Mul(stats.togo,100)
  475.   StringF(temp,' Complete \d %',100-Div(var,gp.len))
  476.   settext(gp.gh,gp.hookgad,temp)
  477. ENDPROC TRUE
  478.  
  479. PROC dummy()
  480. ENDPROC
  481. CHAR PROGRAMVERSION
  482. /*EE folds
  483. -1
  484. 44 12 52 137 55 61 58 42 61 31 64 16 67 12 70 31 73 4 77 21 80 4 83 8 86 11 
  485. EE folds*/
  486.